<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>全局变量和局部变量</title>
</head>

<body>
  <script>
    // 案例1:
    /* var a = 100;
    function fn1() {
      // 函数内没有声明变量a,所以a就到全局环境里面去找.
      console.log(a);
    }
    fn1()   */// 100

    // 案例2:
    /*  var a = 100;
     function fn2() {
       console.log(a);
       a = 200
     }
     fn2(); // 输出 100
     console.log(a); //200 */

    // 案例3:
    /*    var a = 100;
       function fn2() {
         // 使用var声明的变量,在函数内是局部的变量,作用域只在函数内部有效.
         console.log(a);
         var a = 200
         // var a;
         // console.log(a);
         // a = 200
       }
       fn2(); // 输出  undefined
       console.log(a); //100 , 只能拿到全局环境下的变量a的值.
    */
    var a = 100;

    var b = "全局的变量b"
    function fn1() {
      // var a = 200; // 用var ,let, const声明,就是局部变量了.
      // a = 200;  // 没有使用var声明,就变成全局变量了.
      // var b = 30;

      return function fn2() {
        console.log("b=", b);

        return function fn3() {
          console.log("fn3 里面的输出:b=", b);
        }
      }
    }
    console.log(a); // 100

    var myFn2 = fn1();

    console.log(a);// 100

    console.log(myFn2);  // 就是Fn2函数本身

    var myFn3 = myFn2();  // b= 30, 同时返回fn3函数,再赋值给myFn3

    myFn3(); //fn3 里面的输出:b= 30

    /*
  1. 在函数中使用变量时，首先在函数内部看有没有声明变量，如果有，则使用内部变量。
  2. 如果函数内没有声明变量，就去函数外面看有没有声明变量（最终去找全局变量）。如果在全局环境下找到变量，就使用全局
  变量。如果找不到，就报错。
  3. 函数内一个变量没有使用var,let, const来声明，则这个变量回被声明为一个全局的变量。
  
  对象的原型链。对象的属性时根据原型链来查找。
   */
  </script>
</body>

</html>